// #include <stdio.h>
// #include <stdlib.h>
// #include <stdbool.h>
// #include"windows.h"
//
// #define MaxVertexNum 100 // 最大顶点数
//
// typedef char VertexType; // 顶点数据类型
//
// // 边表节点
// typedef struct ArcNode {
//     int adjvex;          // 该弧指向的顶点位置
//     struct ArcNode* next; // 指向下一条弧的指针
// } ArcNode;
//
// // 顶点表节点
// typedef struct VNode {
//     VertexType data;    // 顶点信息
//     ArcNode* first;     // 指向第一条依附该顶点的弧的指针
// } VNode, AdjList[MaxVertexNum];
//
// // 邻接表图结构
// typedef struct {
//     AdjList vertices; // 邻接表
//     int vexnum, arcnum; // 顶点数和边数
// } ALGraph;
//
// // 初始化邻接表图
// void InitALGraph(ALGraph* G) {
//     G->vexnum = 0;
//     G->arcnum = 0;
//     for (int i = 0; i < MaxVertexNum; i++) {
//         G->vertices[i].first = NULL;
//     }
// }
//
// // 添加顶点到邻接表图
// void AddVertexAL(ALGraph* G, VertexType v) {
//     if (G->vexnum < MaxVertexNum) {
//         G->vertices[G->vexnum].data = v;
//         G->vexnum++;
//     }
// }
//
// // 添加边到邻接表图
// void AddEdgeAL(ALGraph* G, int v1, int v2) {
//     if (v1 >= 0 && v1 < G->vexnum && v2 >= 0 && v2 < G->vexnum) {
//         ArcNode* newNode = (ArcNode*)malloc(sizeof(ArcNode));
//         newNode->adjvex = v2;
//         newNode->next = G->vertices[v1].first;
//         G->vertices[v1].first = newNode;
//         G->arcnum++;
//     }
// }
//
// // 拓扑排序
// bool TopologicalSort(ALGraph* G) {
//     // 初始化入度数组
//     int inDegree[MaxVertexNum] = {0};
//
//     // 计算每个顶点的入度
//     for (int i = 0; i < G->vexnum; i++) {
//         ArcNode* p = G->vertices[i].first;
//         while (p != NULL) {
//             inDegree[p->adjvex]++;
//             p = p->next;
//         }
//     }
//
//     // 初始化栈（用于存储入度为 0 的顶点）
//     int stack[MaxVertexNum];
//     int top = -1;
//
//     // 将所有入度为 0 的顶点入栈
//     for (int i = 0; i < G->vexnum; i++) {
//         if (inDegree[i] == 0) {
//             stack[++top] = i;
//         }
//     }
//
//     // 拓扑排序结果
//     int count = 0; // 记录已排序的顶点数
//     int result[MaxVertexNum]; // 存储拓扑排序结果
//
//     // 开始拓扑排序
//     while (top != -1) {
//         int v = stack[top--]; // 出栈
//         result[count++] = v; // 将顶点加入结果
//
//         // 遍历 v 的所有邻接点
//         ArcNode* p = G->vertices[v].first;
//         while (p != NULL) {
//             int w = p->adjvex;
//             inDegree[w]--; // 将邻接点的入度减 1
//             if (inDegree[w] == 0) {
//                 stack[++top] = w; // 如果入度为 0，入栈
//             }
//             p = p->next;
//         }
//     }
//
//     // 检查是否有环
//     if (count < G->vexnum) {
//         printf("图中有环，无法进行拓扑排序！\n");
//         return false;
//     }
//
//     // 输出拓扑排序结果
//     printf("拓扑排序结果：\n");
//     for (int i = 0; i < count; i++) {
//         printf("%c ", G->vertices[result[i]].data);
//     }
//     printf("\n");
//
//     return true;
// }
//
// int main() {
//     SetConsoleOutputCP(CP_UTF8);
//     ALGraph G;
//     InitALGraph(&G);
//
//     // 添加顶点
//     AddVertexAL(&G, 'A');
//     AddVertexAL(&G, 'B');
//     AddVertexAL(&G, 'C');
//     AddVertexAL(&G, 'D');
//     AddVertexAL(&G, 'E');
//     AddVertexAL(&G, 'F');
//
//     // 添加边
//     AddEdgeAL(&G, 0, 1); // A -> B
//     AddEdgeAL(&G, 0, 2); // A -> C
//     AddEdgeAL(&G, 1, 3); // B -> D
//     AddEdgeAL(&G, 2, 3); // C -> D
//     AddEdgeAL(&G, 3, 4); // D -> E
//     AddEdgeAL(&G, 4, 5); // E -> F
//
//     // 执行拓扑排序
//     if (!TopologicalSort(&G)) {
//         printf("拓扑排序失败！\n");
//     }
//
//     return 0;
// }